package 中等.位运算;

/**
 * 给你一个下标从 0 开始的整数数组 nums 。一次操作中，选择 任意 非负
 * 整数 x 和一个下标 i ，更新 nums[i] 为 nums[i] AND (nums[i] XOR x) 。
 * 注意，AND 是逐位与运算，XOR 是逐位异或运算。
 * 请你执行 任意次 更新操作，并返回 nums 中所有元素 最大 逐位异或和。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/maximum-xor-after-operations
 */
public class 操作后的最大异或和_2317 {

    public static void main(String[] args) {

        System.out.println(Math.pow(2, 28) > 2 * Math.pow(10, 8));
        System.out.println(maximumXOR(new int[]{3, 2, 4, 6}));

    }


    /**
     * 找规律+脑筋急转弯
     * [3, 2, 4, 6] 二进制表示：
     * 0011
     * 0010
     * 0100
     * 0110  --> 0111
     * 2，nums[i] AND (nums[i] XOR x)，此操作只能将对应二进制位将 1 变成 0
     * 3，对于每个二进制位，只要数组中存在一个数在此位上是 1 ，那么答案这个位是 1
     */
    public static int maximumXOR(int[] nums) {
        int ans = 0;
        for (int num : nums) {
            for (int i = 0; i < 28; i++) {
                if (((num >> i) & 1) == 1) {
                    ans |= 1 << i;
                }
            }
        }
        return ans;
    }

    // 不用每一个数一个位一个位进行或运算，直接用整个数或运算
    public static int maximumXOR2(int[] nums) {
        int ans = 0;
        for (int num : nums) {
            ans |= num;
        }
        return ans;
    }

}
